各位日安,還記得在這篇文章的時候
決定欄位! 天下沒有白吃的午餐,股價、籌碼資料的其他來源? ,
(註: 檔案格式是.csv
,因為excel預設是.xlsx
,開起來會像是亂碼一般的生僻字和字元)
如果懶得寫程式,用excel開要用csv的讀檔方式
資料表下載下來的資料欄位(如下圖)
我先保留前四個欄位券商代碼
、券商名稱
、開業日
、地址
備用,把資料另存成.xlsx方便開啟。
總共有847筆資料。
券商代碼 券商名稱 開業日 地址
1020 合庫 2011/12/2 台北市大安區忠孝東路四段285號1樓(部分)、經紀部複委託科地址:台北市松山區長安東路二段225號5樓
1021 合庫- 台中 2011/12/2 台中市西區民權路91號6樓
1022 合庫-台南 2011/12/2 台南市北區成功路48號3樓
如果逐一觀察每筆資料,會發現有的券商地點不只一個位置,甚至還有部分這種。
例如:
2210 群益期貨 2015/9/1 台北市大安區敦化南路2段97號32樓及地下1樓
5050 大展 1988/8/11 台北市承德路1段17號17樓、17樓之1、之2、之3
5058 大展-台南 2019/7/16 台南市西門路三段159號3樓
5110 富隆 1988/8/29 台北市南京東路3段287號3樓部份
5260 美好 1988/9/6 台北市民生東路2段174、176號3樓部份、4樓、174號12樓
這時如果要讓這份資料要能夠畫成證券商分點地圖,就需要再對資料進行一些前處理
先把檔案讀進來
import pandas as pd
# 讀取Excel檔案,路徑改成你資料夾和檔案所在的地方
df = pd.read_excel('E:/時空資料分析/關鍵分點籌碼分析_實測/files_ss/證券商地址_修.xlsx')
df
接著透過split
把字切開,針對地址
這個欄位,再另存起來
# 定義一個函數來截斷'號'字後的文字
def truncate_after_char(address):
return address.split('號')[0] + '號' if '號' in address else address
# 對'地址'欄位的每個項目應用這個函數
df['地址'] = df['地址'].apply(truncate_after_char)
# 將修改後的資料表保存到新的Excel檔案,檔案會儲存到你程式檔案的當前資料夾
df.to_excel("modified_file.xlsx", index=False)
一般我們如果在地圖上看一個人的家或是居住地址的時候,
如果把樓層也一併輸入google map查詢,有樓層的地址
在地圖上呈現的位置和沒有樓層的地址
一樣!
例如下圖,即使是公寓或是租屋處,地圖也只能呈現2D平面圖,所以樓層在地圖上並不是那麼地重要。
此外,如果有兩個地點以上,google map查不出來那個地址(錯亂)。
這時如果再用滑鼠對那個位置按右鍵
,就可以看見那個位置的經緯度
(前面是緯度(lat),後面是經度(lng))
但是,有800多筆資料,要這樣一筆一筆輸入查詢,點右鍵,再把拿到的經緯度自己填進去資料表,
如果不是有很多時間,好像不太現實,也不太有效率。
所以,參考了其他人是如何把地址轉成經緯度的,
(也有其他的方法可以做到)
接著,按照這篇文章的教學,會拿到你的API金鑰(API key)
,記得複製後保存起來。
這時用參考github上的這個專案的方式,嘗試看看。
在進行以下之前,要先 pip install
必要的套件庫,安裝後要重新把kernel
啟動才會成功套用
pip install -U selenium
!pip install python-dotenv
pip install pipenv
!pip install geocoder
pip install googlemaps
接著引入需要用到的套件庫
import requests
import urllib #結果這個好像是多參考的,原作者只是拿來測試用,我沒用到哈哈
import json
import time
import pandas as pd
定義一個函式,利用google查詢地址時上面的網址去做操作
def get_latitude_longtitude(address, GOOGLE_PLACES_API_KEY):
# decode url
# address = urllib.quote(address)
url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + address + '&key=' + GOOGLE_PLACES_API_KEY
while True:
res = requests.get(url)
js = json.loads(res.text)
if js['status'] != 'OVER_QUERY_LIMIT':
time.sleep(1)
break
result = js['results'][0]['geometry']['location']
lat = result['lat'] # 緯度
lng = result['lng'] # 經度
return address, lat, lng
接著嘗試看看查詢單一個地址,看看 API key 有沒有正常運作
#單一地址
address = '台北縣板橋市南雅南路二段一七0號'
GOOGLE_PLACES_API_KEY = 'AAsUfyAQ9PXgy3JjU2Nvy_3AvECs8Gj-fM-W6po' # 把 API KEY 寫在' '裡面
get_latitude_longtitude(address, GOOGLE_PLACES_API_KEY)
#lat, lng = get_latitude_longtitude()
('台北縣板橋市南雅南路二段一七0號', 24.9988421, 121.4526873)
modified_file.xlsx
批次進行查詢的動作既然單次可以正常運作,就可以開始把剛才處理過的excel檔讀進來批次操作。
沿用上面的程式碼,寫在一起:
# 匯入資料,有中文的時候要注意編碼用 utf-8 或 big5
import pandas as pd
import requests
import json
import time
def get_latitude_longtitude(address, GOOGLE_PLACES_API_KEY):
url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + address + '&key=' + GOOGLE_PLACES_API_KEY
while True:
res = requests.get(url)
js = json.loads(res.text)
if js['status'] != 'OVER_QUERY_LIMIT':
time.sleep(1)
break
result = js['results'][0]['geometry']['location']
lat = result['lat']
lng = result['lng']
return address, lat, lng
# 讀取剛才存的 Excel 檔案
data = pd.read_excel('E:/時空資料分析/關鍵分點籌碼分析_實測/files_ss/modified_file.xlsx')
# 建立新的資料框架,包含原始資料和新增的經緯度欄位
df_empty = pd.DataFrame(columns=['券商代碼', '券商名稱', '開業日', '地址', '緯度', '經度'])
# Google Places API Key
GOOGLE_PLACES_API_KEY = 'AAsUfyAQ9PXgy3JjU2Nvy_3AvECs8Gj-fM-W6po'
# 用for迴圈跑原始資料框架的每一行
for index, row in data.iterrows():
address = row['地址']
result = get_latitude_longtitude(address, GOOGLE_PLACES_API_KEY)
print(result)
# 將查詢結果加入新的資料框架
df_empty.loc[len(df_empty)] = [row['券商代碼'], row['券商名稱'], row['開業日'], result[0], result[1], result[2]]
# 避免 API 請求過於頻繁
time.sleep(1)
# 將新的資料框架輸出成新的 Excel 檔案
df_empty.to_excel('PLUS_lat_lng_address.xlsx', index=False)
('台北市大安區忠孝東路四段285號', 25.0416821, 121.5542213)
('台中市西區民權路91號', 24.1380648, 120.6795332)
('台南市北區成功路48號', 22.9981399, 120.2077419)
('高雄市大勇路97號', 22.6247854, 120.28419)
('嘉義市國華街279號', 23.4805488, 120.4483104)
('基隆市仁二路255號', 25.1297521, 121.7424337)
('彰化縣彰化市民生路279號', 24.0819936, 120.5423098)
('高雄市鳳山區鳳松路3號', 22.6321339, 120.3607556)
('新竹市東區東門街60號', 24.8044371, 120.972732)
('台北市中山區南京東路2段85、87號', 25.0523761, 121.5318859)
('桃園市桃園區中華路12號', 24.9912755, 121.311581)
('台中市西屯區漢口路二段151號', 24.1652868, 120.6617334)
('新北市三重區正義南路17號', 25.0613709, 121.497948)
('台北市松山區長安東路二段225號', 25.0487974, 121.5454745)
...
今天先到這邊,明天繼續!
謝謝各位的收看。
參考文章&資料來源:
1.Google Maps API 學習筆記-1:地圖、標記、客製樣式
2.Python_Latitude-and-Longitude-github
3.google map API設定教學-Webduino 學習手冊
每日記錄:
加權指數:收在21796.57點,上漲23.31點,開始要進入穩定的盤整期了嗎(?
大家都在等聯準會的降息,不知道這期間會不會突然來個黑天鵝。
這幾天發生好多事,台灣的奧運好手們回國了,昨天還有一起成大的死亡車禍,癲癇還開車真的很可怕...